package jp.ac.waseda.cs.washi.game.ai;

import java.util.ArrayList;

import jp.ac.waseda.cs.washi.game.api.CharaInfo;
import jp.ac.waseda.cs.washi.game.api.GameInfo;
import jp.ac.waseda.cs.washi.game.api.MapInfo;
import jp.ac.waseda.cs.washi.game.api.Player;
import jp.ac.waseda.cs.washi.game.api.PlayerAction;
import jp.ac.waseda.cs.washi.gameaiarena.api.Direction4;
import jp.ac.waseda.cs.washi.gameaiarena.api.Point2;

// 足元を開発しながら、ランダムに行動するAI
public class Sample2 implements Player {
	MapInfo map = null; // マップ情報
	CharaInfo mychara = null; // 自プレイヤー情報
	CharaInfo enemy = null; // 敵プレイヤー情報
	ArrayList<PlayerAction> moveList; // 目的地へ到達するためのアクションリスト

	@Override
	public void initialize(GameInfo gameInfo) {
		this.map = gameInfo.getMap();
		this.mychara = gameInfo.getPlayer();
		this.enemy = gameInfo.getEnemy();
		this.moveList = new ArrayList<PlayerAction>();
	}

	@Override
	public PlayerAction execute(GameInfo gameInfo) {
		// 移動する要素が存在しなかったら、新しく目的地を設定する。
		if (moveList.isEmpty()) {
			// 目的地をランダムに生成する。（目的地が壁等の到達不可能地点であったら生成し直す）
			Point2 dstPoint;
			do {
				dstPoint = new Point2((int) (Math.random() * map.getWidth()),
						(int) (Math.random() * map.getHeight()));
			} while (!map.isMovable(dstPoint));

			// 目的地へ到達するための経路を取得し、リストに追加する。
			Direction4[] dirs = map.getPath(mychara.getLocation(), dstPoint);
			for (int i = 0; i < dirs.length; i++) {
				moveList.add(PlayerAction.fromDirection(dirs[i]));
			}
		}

		// 足元が完全に開発されていなかったら、魔法陣を開発する。
		// 足元が自分の完全魔法陣もしくは開発不可能マスであったら、目的地へ移動する。
		if (map.getRequiredDevelopCount(mychara, mychara.getLocation()) > 0) {
			return PlayerAction.SPELL;
		} else {
			return moveList.remove(0);
		}
	}
}
